/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import net.etrs.formathlon.entity.formation.Domaine;
import net.etrs.formathlon.entity.formation.Formation;
import net.etrs.formathlon.persistance.formation.DomaineFacade;
import net.etrs.formathlon.persistance.formation.FormationFacade;
import net.etrs.formathlon.persistance.formation.ParticipationFacade;
import net.etrs.formathlon.persistance.utilisateur.PersonnelFacade;
import org.apache.myfaces.trinidad.model.ChartModel;

/**
 *
 * @author Ddez
 */
@ManagedBean
@RequestScoped
public class ChartBean {
    
    
    @EJB
    private DomaineFacade domaineFacade;
    @EJB
    private FormationFacade formationFacade;
    @EJB
    private ParticipationFacade participationFacade;
    @EJB
    private PersonnelFacade personnelFacade;
    

    private ChartModel value;
    private UIComponent component;
    
    
    //domaine / série / formation / nb participations
    private Map<Domaine, Map<Boolean, Map<Formation, Long>>> statistiques;
    private List<String> series;
    
    
    
    @PostConstruct
    public void init(){
        List<Domaine> listDomaine=domaineFacade.getDomaineWithFormation();
        //construction des séries (type de formation)
        {
            series=new ArrayList<String>();
            series.add("Formations de base");
            series.add("Formations complémentaires");
        }
        //construction des groupes (domaines)
        {
            statistiques=new HashMap<Domaine, Map<Boolean, Map<Formation, Long>>>();
            for(Domaine domaine : listDomaine){
                statistiques.put(domaine, new HashMap<Boolean, Map<Formation, Long>>());

                //false : série pour les formations de base
                statistiques.get(domaine).put(Boolean.FALSE, new HashMap<Formation, Long>());
                
                //true : série pour les formations complémentaires
                statistiques.get(domaine).put(Boolean.TRUE, new HashMap<Formation, Long>());
            }
        }
        //construction de la liste des valeurs (nombre de participations par formation)
        {
            //pour l'ensemble des domaines
            for(Domaine domaine : listDomaine){
                
                //pour l'ensemble des formations de base du domaine
                for(Formation formation : formationFacade.getListFormationBase(domaine)){
                    //récupérer le nombre de participations
                    statistiques.get(domaine).get(Boolean.FALSE).put(
                            formation, participationFacade.getNbParticipations(formation));
                }
                
                //pour l'ensemble des formations complémentaires du domaine
                for(Formation formation : formationFacade.getListFormationComplementaire(domaine)){
                    //récupérer le nombre de participations
                    statistiques.get(domaine).get(Boolean.TRUE).put(
                            formation, participationFacade.getNbParticipations(formation));
                }
                
            }
        }
    }
    
    
    /** Creates a new instance of ChartBean */
    public ChartBean() {
        value=new ChartModel() {

            @Override
            public String getTitle() {
                return "Pourcentage de personnels formés";
            }

            @Override
            public List<String> getSeriesLabels() {
                return series;
            }

            @Override
            public List<String> getGroupLabels() {
                List<String> retour=new ArrayList<String>();
                for(Domaine domaine : statistiques.keySet()){
                    retour.add(domaine.getLibelle());
                }
                return retour;
            }

            @Override
            public List<List<Double>> getYValues() {
                List<List<Double>> retour=new ArrayList<List<Double>>();
                Long nbPersonnels=personnelFacade.getNbPersonnels();
                
                for(Domaine domaine : statistiques.keySet()){
                    List<Double> liste=new ArrayList<Double>();
                    //pour l'ensemble des formations de base du domaine
                    {
                        Double cumul=0d;
                        Double percent=0d;
                        if(!statistiques.get(domaine).get(Boolean.FALSE).isEmpty()){
                            for(Long nbParticipation : statistiques.get(domaine).get(Boolean.FALSE).values()){
                                cumul+=nbParticipation;
                            }
                            percent=cumul/(statistiques.get(domaine).get(Boolean.FALSE).size()*nbPersonnels);
                        }
                        liste.add(percent*100);
                    }
                    //pour l'ensemble des formations complémentaires du domaine
                    {
                        Double cumul=0d;
                        Double percent=0d;
                        if(!statistiques.get(domaine).get(Boolean.TRUE).isEmpty()){
                            for(Long nbParticipation : statistiques.get(domaine).get(Boolean.TRUE).values()){
                                cumul+=nbParticipation;
                            }
                            percent=cumul/(statistiques.get(domaine).get(Boolean.TRUE).size()*nbPersonnels);
                        }
                        liste.add(percent*100);
                    }
                    retour.add(liste);
                }
                System.out.println("Retour :");
                for(List<Double> liste : retour){
                    System.out.println("Liste "+liste.toString());
                    for(Double dbl : liste){
                        System.out.println("  - "+dbl);
                    }
                }
                return retour;
            }
        };
    }

    public ChartModel getValue() {
        return value;
    }

    /**
     * @param value the value to set
     */
    public void setValue(ChartModel value) {
        this.value = value;
    }

    /**
     * @return the component
     */
    public UIComponent getComponent() {
        return component;
    }

    /**
     * @param component the component to set
     */
    public void setComponent(UIComponent component) {
        this.component = component;
    }
    
}